<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <script>
    /* 
    then返回的promise的结果由什么决定
		简单表达: 由then指定的回调执行的结果决定
		详细表达, 分下面3大类, 5小类情况
				1) 抛出错误
				2) 返回失败的promise
				3) 返回成功的promise
				4) 返回其它非promise值
				5) 返回pending的promise

        根据结果状态类型分类1
          结果是成功的
          结果是失败的
          结果是pending
        根据返回值类型分
          返回promise  ==> 得到并改为它的状态
          返回非promise  ==> 变为成功状态
          抛出错误   ==> try---catch  => 变为失败状态
    */

    new Promise((resolve, reject) => {
      // setTimeout(() => {
      //   // resolve(1)
      //   // reject(2)
      // }, 1000);

      // resolve(3)
      reject(4)
    }).then(
      value => {
        console.log('onResolved1', value)
      },
      reason => {
        console.log('onRejected1', reason)
        // 1) 抛出错误 => 失败, reason就是抛出的错误
        // throw 5

				// 2) 返回失败的promise => 失败, reason是失败promise的reason
        // return Promise.reject(6)

				// 3) 返回成功的promise => 成功, value是成功promise的value
        // return Promise.resolve(7)

				// 4) 返回其它非promise值  => 成功, value是返回值
        // return 8

				// 5) 返回pending的promise  => pending
        return new Promise(() => {})
      }
    ).then(
      value => {
        console.log('onResolved2', value)
      },
      reason => {
        console.log('onRejected2', reason)
      }
    )


    const p = new Promise((resolve, reject) => {
      setTimeout(() => {
        resolve(1)
      }, 1000);
    })

    p.then(
      value => {},
      reason => {}
    )
    p.then(value => {})
    /* 
    1. 一个promise可以指定多个回调
    2. 当指定回调函数时, 
        如果promise还是pending, 内部会先保存回调函数
        等到变为成功或失败时, 才将对应的回调放入微队列中
    */
  </script>
</body>
</html>